home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™ 1987-1994 / MacHack™ '90 / Source Code ƒ.sea / Source Code ƒ / Modula2 ƒ / DataStack Filer / LocLib.MOD.o < prev    next >
Encoding:
Text File  |  1990-06-14  |  2.7 KB  |  105 lines  |  [OBJ /MPS ]

  1. header := AddGrowCard(stack);
  2.             IF header = NIL THEN RETURN 0; END;
  3.         ELSE
  4.             header := VAL( ADDRESS, VAL(LONGCARD,filledCards) * VAL(LONGCARD,cardSize) )
  5.                                 + VAL(ADDRESS, dataPtr);
  6.             INC(filledCards);
  7.             END;
  8.         END;
  9.     
  10.     CopyStr(31,name,header^.cName);
  11.     INC(stack^^.totalFilled);
  12.     FillHeader(stack,header);
  13.     
  14.     dest := VAL(ADDRESS,header) + SIZE(CardHeader); (* data goes just after header. *)
  15.     BlockMove(data,dest,VAL(LONGINT,stack^^.cardSize-VAL(CARDINAL,SIZE(CardHeader))));
  16.     
  17.     RETURN header^.id;
  18.     END AddCard;
  19.  
  20. PROCEDURE FindKeyIndex(keysArrPtr:DataKeysPtr; indx,totFil:CARDINAL):CARDINAL;
  21. EXTERNAL;
  22.  
  23. (*
  24. PROCEDURE FindKeyIndex(keysArrPtr:DataKeysPtr; indx,totFil:CARDINAL):CARDINAL;
  25. VAR i :CARDINAL;
  26. BEGIN
  27.     i := 1;
  28.     REPEAT
  29.         IF keysArrPtr^[i] = indx THEN RETURN i; END;
  30.         INC(i);
  31.         UNTIL i > totFil;
  32.     RETURN 0;
  33.     END  FindKeyIndex;
  34. *)
  35.  
  36. PROCEDURE UpdateCardKeys(keysArrPtr:DataKeysPtr; indx,totFil:CARDINAL);
  37. VAR
  38.     targKeyIndx,lastKeyIndx :CARDINAL;
  39.     dst :ADDRESS;
  40. BEGIN
  41.     (* find index of key pointing to target card. *)
  42.     targKeyIndx := FindKeyIndex(keysArrPtr,indx,totFil);
  43.     
  44.     (* find index of key pointing to last card. *)
  45.     lastKeyIndx := FindKeyIndex(keysArrPtr,totFil,totFil);
  46.     
  47.     (* replace key to lastCard with indx (new location for lastCard). *)
  48.     keysArrPtr^[lastKeyIndx] := indx;
  49.     
  50.     (* move keys up and over indx of key pointing to target. *)
  51.     (* dst := VAL(LONGINT,targKeyIndx)*2 + VAL(ADDRESS,keysArrPtr); *)
  52.     dst := ADR(keysArrPtr^[targKeyIndx]);
  53.     BlockMove(dst+SIZE(CARDINAL),dst,VAL(LONGINT,totFil-targKeyIndx)*SIZE(CARDINAL));
  54.     END UpdateCardKeys;
  55.  
  56. PROCEDURE RemoveLastGrowBlock(stack:DataStack);
  57. VAR growHnd,preGrowHnd :GrowStack;
  58. BEGIN
  59.     preGrowHnd := NIL;
  60.     growHnd := stack^^.growStk; (* we know growStk is not NIL. *)
  61.     WHILE growHnd^^.growStk # NIL DO
  62.         preGrowHnd := growHnd;
  63.         growHnd := growHnd^^.growStk;
  64.         END;
  65.     IF preGrowHnd = NIL THEN (* remove first growStk. *)
  66.         DisposPtr(stack^^.growStk^^.dataPtr);
  67.         DisposHandle(stack^^.growStk);
  68.         stack^^.growStk := NIL;
  69.     ELSE
  70.         DisposPtr(growHnd^^.dataPtr);
  71.         DisposHandle(preGrowHnd^^.growStk);
  72.         preGrowHnd^^.growStk := NIL;
  73.         END;
  74.     END RemoveLastGrowBlock;
  75.  
  76. PROCEDURE RemoveLastCard(stack:DataStack);
  77. VAR growHnd :GrowStack;
  78. BEGIN
  79.     growHnd := stack^^.growStk;
  80.     IF growHnd = NIL THEN
  81.         DEC(stack^^.filledCards);
  82.     ELSE
  83.         WHILE growHnd^^.growStk # NIL DO
  84.             growHnd := growHnd^^.growStk;
  85.             END;
  86.             
  87.         IF growHnd^^.filledCards = 1 THEN
  88.             RemoveLastGrowBlock(stack);
  89.         ELSE
  90.             DEC(growHnd^^.filledCards);
  91.             END;
  92.         END;
  93.     DEC(stack^^.totalFilled);
  94.     END RemoveLastCard;
  95.  
  96. PROCEDURE RemoveCard(stack:DataStack; indx:CARDINAL; id:LONGCARD);
  97. VAR
  98.     targ,last :HeadPtr;
  99.     totFil :CARDINAL;
  100. BEGIN
  101.     IF indx > totFil THEN
  102.         dataStackErr := indxOutOfRange;
  103.         RETURN;
  104.     ELSE
  105.         dataStackE